package org.baizhiedu.aspect;

import org.baizhiedu.Log;
import org.baizhiedu.proxy.User;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.swing.*;

/**
 * ClassName: UserServiceImpl
 * Description:
 * Date: 2022/11/21 AM 11:46:58
 * <p>
 * project: spring5
 * package: org.baizhiedu.proxy
 * email: 1085844536@qq.com
 * version:
 *
 * @author WangGuojian
 */
public class UserServiceImpl implements UserService, ApplicationContextAware {

    private ApplicationContext ctx;

    /**
     * 坑：在同一个业务类中，进行业务方法间的相互调用，只有最外层的方法，才是加入了额外功能(内部的方法，通过普通的方式调用，都是调用的是原始方法)。
     * 如果想让内层的方法也调用代理对象的方法，就要 ApplicationContextAware 获得工厂，进而获得代理对象
     *
     * @param user 用户
     */
    @Log
    @Override
    public void register(User user) {
        System.out.println("UserServiceImpl.register 业务运算 + DAO ");
        //throw new RuntimeException("测试异常");
        // 调用的是原始对象的 login 方法 ---> 核心功能
        // 设计目的：代理对象的 login 方法 ---> 额外功能 + 核心功能
        //  ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext2.xml");
        //  userService.login();
        //  Spring 工厂重量级资源 一个应用中 应该只创建一个工厂
        UserService userService = (UserService) ctx.getBean("userService");
        userService.login("suns", "123456");
    }

    @Log
    @Override
    public boolean login(String name, String password) {
        System.out.println("UserServiceImpl.login");
        return true;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.ctx = applicationContext;
    }
}
